package com.zwh.se.common.pojo;

import java.io.Serializable;

/**
 * @author yexi
 * 本类实现了序列化接口(Serializable)：该接口是一个标识接口(内部什么都没有)。只有实现这个接口的类的对象才能序列化，否则不可以。
 */
public class Student implements Serializable {

    //凡是实现Serializable接口（标识接口）的类都有这样一个表示序列化版本标识符的静态常量：
    private static final long serialVersionUID = 1L;
    //serialVersionUID用来表明类的不同版本间的兼容性。简言之，其目的是以序列化对象进行版本控制，有关各版本反序加化时是否兼容。
    //如果类没有显示定义这个静态变量，它的值是Java运行时环境根据类的内部细节会自动生成。因此若类的实例变量做了修改，serialVersionUID 可能发生变化。故建议，显式声明。
    //简单来说，Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在
    //   进行反序列化时，JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较，如果相同就认为是一致的，可以进行反序列化，
    //   否则就会出现序列化版本不一致的异常。(InvalidCastException)
    //序列化细节：
    //(1):被序列化的类的内部的所有属性，必须都是可序列化的（基本数据类型本身都是可序列化的）（意思是如果成员变量有对象，那那个对象也必须是可序列化的）
    //(2):static，transient修饰的属性 不会被序列化。

    private Long id;
    private String name;
    private int age;
    private int score;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Student student = (Student) o;

        if (age != student.age) return false;
        if (id != null ? !id.equals(student.id) : student.id != null) return false;
        return name != null ? name.equals(student.name) : student.name == null;
    }

    @Override
    public int hashCode() {
        int result = id != null ? id.hashCode() : 0;
        result = 31 * result + (name != null ? name.hashCode() : 0);
        result = 31 * result + age;
        return result;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Student() {
    }

    public Student(Long id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Student(Long id, String name, int age, int score) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.score = score;
    }


    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }
}
